package controlsystem;

/*
 * AlertController is een classe die een waarschuwing geeft als je een week niet of te weinig aan een vak hebt gewerkt.
 * @author Christiaan Leysen & Stijn Hoskens
 */

import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
import java.util.Date;
import java.util.Calendar;

import tracksystem.SchoolActivity;
import tracksystem.Activity;
import managesystem.Student;


public class AlertController {

	/**
	 * Constructor
	 */
	
	private static boolean testing;
	
	public AlertController()
	{
		testing = false;
	}


	/**
	 * methode om een alert te geven voor alle vakken waarvoor er te weinig is gebeurd
	 * @param currStud de student
	 * @return een lijst met de alerts
	 */
	public static ArrayList<Alert> returnAlert(Student currStud)
	{   
		Calendar calendar=Calendar.getInstance();
		Date vandaag = calendar.getTime();
		ArrayList<Alert> alerts = new ArrayList<Alert>();
		List<Course> courses = currStud.getCourses();
		Iterator<Course> it = courses.iterator();
		while (it.hasNext()) {
			Course vak = it.next();
			double verschil=calculateTime(vak.getName(), currStud);

			if(verschil>=5)
			{
				alerts.add(new Alert(vak,"You are more than 5 hours behind on the standard schedule for " + vak.getName() + ".",vandaag,false));
			}
			long weekTijd=calculateWeekTime(vak.getName(), currStud);
			if (weekTijd==0)
			{
				alerts.add(new Alert(vak,"You did'nt work for "+vak.getName()+".",vandaag,false));
			}
		}
		if(testing == true){
			Iterator<Alert> iterator = alerts.iterator();
			while(iterator.hasNext()){
				System.out.println(iterator.next().getDescription());
			}
		}
		return alerts;
	}

	/**
	 * methode om de standaard spendeertijd van de vakken aan te roepen
	 * @param courseName de naam van het vak
	 * @param currStud de desbetreffende student
	 * @return void
	 */
	public static double getEstTime(String courseName, Student currStud)
	{   
		Calendar calendar=Calendar.getInstance();
		double time=0;
		Date vandaag = calendar.getTime();
		Calendar beginSj = Calendar.getInstance(); //beginSj is beginSchooljaar
		beginSj.set(Calendar.MONTH,Calendar.SEPTEMBER);
		beginSj.set(Calendar.YEAR,calendar.get(Calendar.YEAR));
		beginSj.set(Calendar.DAY_OF_MONTH,1);
		Date begin= beginSj.getTime();
		long diff = vandaag.getTime() - begin.getTime();
		long verschil= diff/(1000*60*60*24);
		Iterator<Course> it = currStud.getCourses().iterator();
		while (it.hasNext()) {
			Course c = it.next();
			if(c.getName().equals(courseName))
			{
				time =c.getStudyPoints()*27.5*(verschil/(13*7));
			}
		}
		return time;
	}


	/**
	 * methode die het verschil tussen de echte spendeertijd van de student en de 
	 * standaard spendeertijd van de vakken berekent
	 * @param courseName de naam van het vak
	 * @param currStud de desbetreffende student
	 * @return void
	 */
	private static double calculateTime(String courseName, Student currStud)
	{   
		double verschil= 0;
		Iterator<Course> it = currStud.getCourses().iterator();
   	 	while (it.hasNext()) 
   	 	{
   	 		if(it.next().getName().equals(courseName))
   	 		{
   	 			verschil = getEstTime(courseName, currStud)-calculateSpendTime(courseName, currStud);	  
   	 		}
   	 	}
   	 	return verschil;
	}

	/**
	 * methode die de totaal gespendeerde tijd per vak berekend 
	 * standaard spendeertijd van de vakken berekent
	 * @param courseName de naam van het vak
	 * @param currStud de desbetreffende student
	 * @return long met het aantal milliseconde dat de gebruiker aan het vak heeft gespendeerd
	 */
	private static long calculateSpendTime(String courseName, Student currStud)
	{   
		long total=0;
		Iterator<SchoolActivity> it = getSchoolAct(currStud).iterator();
		while (it.hasNext()) 
		{
			SchoolActivity a = it.next();
			if(a.getCourse().getName().equals(courseName))
			{
				total += a.getDuration();
			}
		}
		return total;
	}
	
	/**
	 * methode die het aantal uur gespendeerd aan een vak deze week berekend
	 * @return long met het aantal milliseconden gependeerd deze week voor het vak
	 */
	private static long calculateWeekTime(String courseName, Student currStud)
	{   
		long total = 0;
		Calendar calendar= Calendar.getInstance();
		Date vandaag = calendar.getTime();
		Iterator<SchoolActivity> it =  getSchoolAct(currStud).iterator();
		while (it.hasNext()) 
		{
			SchoolActivity a = it.next();
			if(a.getCourse().getName().equals(courseName))
			{
				//bepaal hoeveel de student deze week voor dit vak heeft gestudeerd 
				if(a.getStart().getTime()>=vandaag.getTime()-7*24*60*60*1000)
				{
					total+=a.getDuration();
				}
			}
		}
		return total;
	}

	/*
	 * methode om enkel een arraylist van schoolActivities te hebben i.p.v. activities
	 * @return een arraylist met SchoolActivities
	 */
	private static ArrayList<SchoolActivity> getSchoolAct(Student currStud)
	{
		ArrayList<SchoolActivity> schoolAct = new ArrayList<SchoolActivity>();
		Iterator<Activity> it = currStud.getAct().iterator();
		while (it.hasNext()) {
			Activity a = it.next();
			if(a instanceof SchoolActivity)
			{	
				
				schoolAct.add((SchoolActivity) a);
			}
		}
		return schoolAct;
	}
}